<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /**
         * 1e-10 是一个科学计数法的写法，表示 10的负10次方
 ，也就是一个非常小的数，约等于 0.0000000001。在 equals 函数中，它用来控制数值类型的近似相等比较精度，两个数值类型的差值如果小于这个数，则认为它们是近似相等的
        */
        function equals(a, b, epsilon = 1e-10) {
            if (typeof a !== typeof b) {
                return false;
            }
            if (a === b) {
                // 包括 undefined、null、数值、字符串、布尔等基本数据类型
                return true;
            }
            if (typeof a === 'number' && typeof b === 'number' &&
                !Number.isNaN(a) && !Number.isNaN(b)) {
                // 数值类型相等有两种可能：完全相等或近似相等
                return Math.abs(a - b) < epsilon;
            }
            if (a instanceof RegExp && b instanceof RegExp) {
                // 正则表达式可以使用 toString() 方法转为字符串后比较
                return a.toString() === b.toString();
            }
            if (a instanceof Date && b instanceof Date) {
                // 日期可以使用 getTime() 方法转为时间戳后比较
                return a.getTime() === b.getTime();
            }
            if (Array.isArray(a) && Array.isArray(b)) {
                // 数组需要逐一比较元素
                if (a.length !== b.length) {
                    return false;
                }
                for (let i = 0; i < a.length; i++) {
                    if (!equals(a[i], b[i], epsilon)) {
                        return false;
                    }
                }
                return true;
            }
            if (a && b && typeof a === 'object' && typeof b === 'object') {
                // 对象需要逐一比较属性
                let keysA = Object.keys(a).sort();
                let keysB = Object.keys(b).sort();
                if (!equals(keysA, keysB)) {
                    return false;
                }
                for (let i = 0; i < keysA.length; i++) {
                    let key = keysA[i];
                    if (!equals(a[key], b[key], epsilon)) {
                        return false;
                    }
                }
                return true;
            }
            return false;
        }

  


        console.log(equals(1/9, 1 - 8/9))
    </script>
</body>
</html>